﻿using System;

//在C#中，EventHandler是一个委托类型，用于定义事件处理程序的签名。它是一种通用的委托类型，可以用于订阅和处理各种事件。
//EventHandler委托定义了一个具有两个参数的方法，第一个参数是事件发送者（通常是触发事件的对象）
//第二个参数是包含事件数据的EventArgs对象。EventArgs是一个基类，用于派生具体的事件参数类。
//public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

public class MyClass
{
    public event EventHandler MyEvent;

    public void DoSomething()
    {
        // 触发事件，并传递自身作为发送者
        OnMyEvent(this, EventArgs.Empty);
    }

    protected virtual void OnMyEvent(object sender, EventArgs e)
    {
        // 检查是否有订阅的事件处理程序
        // 调用事件处理程序，并传递发送者和事件参数
        MyEvent?.Invoke(sender, e);
    }
}

public class MyClass2
{
    public event EventHandler MyEvent;

    public void DoSomething()
    {
        // 触发事件，并传递自身作为发送者
        OnMyEvent(this, EventArgs.Empty);
    }

    protected virtual void OnMyEvent(object sender, EventArgs e)
    {
        // 检查是否有订阅的事件处理程序
        // 调用事件处理程序，并传递发送者和事件参数
        MyEvent?.Invoke(sender, e);
    }
}

public class Program
{
    public static void Main()
    {
        MyClass myObject = new MyClass();
        myObject.MyEvent += MyEventHandler;

        //// 调用对象的方法，触发事件，并传递自身作为发送者
        myObject.DoSomething();

        MyClass2 myObject2 = new MyClass2();
        myObject2.MyEvent += MyEventHandler;

        // 调用对象的方法，触发事件，并传递自身作为发送者
        myObject2.DoSomething();

        Console.ReadKey();
    }

    private static void MyEventHandler(object sender, EventArgs e)
    {
        if (sender is MyClass)
        {
            // 将sender参数转换为MyClass类型
            MyClass myObject = (MyClass)sender;
            Console.WriteLine("事件被触发了！发送者是：" + myObject.GetType().Name);
        }
        else if (sender is MyClass2)
        {
            // 将sender参数转换为MyClass2类型
            MyClass2 myObject = (MyClass2)sender;
            Console.WriteLine("事件被触发了！发送者是：" + myObject.GetType().Name);
        }
    }
}